#include "SchemaDB.h"

extern QSqlDatabase MMyAsocDb;

using namespace std;

SchemaDB::SchemaDB()
{

}

/**
 * @brief SchemaDB::CreateSchemaDB
 * @return true sii la ejecución de query fue satisfactoria, es decir, se crearon
 * todas las tablas exitosamente.
 */
bool SchemaDB::CreateSchemaDB()
{
    MMyAsocDb.setDatabaseName("MMyAsoc");

    QSqlQuery *query = new QSqlQuery(MMyAsocDb);

    /**
      * Se crea la tabla "cliente" con la clausula "if not exists", es decir, si la
      * tabla no existe, la misma será creada, en caso contrario, no lo hará.
      */
    if (! query->exec("create table if not exists cliente "
                      "(nro_cliente serial, "
                      "apellido varchar(60) not null, "
                      "nombre varchar(60) not null, "
                      "calle varchar(50) not null, "
                      "numero integer not null, "
                      "piso integer, "
                      "dpto varchar(30), "
                      "barrio varchar(30), "
                      "ciudad varchar(30) not null, "
                      "provincia varchar(30) not null, "
                      "tipo_tel_1 varchar(5), "
                      "telefono_1 varchar(20), "
                      "tipo_tel_2 varchar(5), "
                      "telefono_2 varchar(20), "
                      "email varchar(60), "
                      "constraint cliente_pkey primary key (apellido))")) {
        ShowCriticalError(query->lastError().text());
        return false;
    }

    /**
      * Se crea la tabla "proveedor" con la clausula "if not exists", es decir, si la
      * tabla no existe, la misma será creada, en caso contrario, no lo hará.
      */
    if (! query->exec("create table if not exists proveedor "
                      "(nro_cliente serial, "
                      "apellido varchar(60) not null, "
                      "nombre varchar(60) not null, "
                      "calle varchar(50) not null, "
                      "numero integer not null, "
                      "piso integer, "
                      "dpto varchar(30), "
                      "barrio varchar(30), "
                      "ciudad varchar(30) not null, "
                      "provincia varchar(30) not null, "
                      "tipo_tel_1 varchar(5), "
                      "telefono_1 varchar(20), "
                      "tipo_tel_2 varchar(5), "
                      "telefono_2 varchar(20), "
                      "email varchar(60), "
                      "constraint proveedor_pkey primary key (apellido))")) {
        ShowCriticalError(query->lastError().text());
        return false;
    }

    /**
      * Se crea la tabla "contratista" con la clausula "if not exists", es decir, si la
      * tabla no existe, la misma será creada, en caso contrario, no lo hará.
      */
    if (! query->exec("create table if not exists contratista "
                      "(nro_cliente serial, "
                      "apellido varchar(60) not null, "
                      "nombre varchar(60) not null, "
                      "calle varchar(50) not null, "
                      "numero integer not null, "
                      "piso integer, "
                      "dpto varchar(30), "
                      "barrio varchar(30), "
                      "ciudad varchar(30) not null, "
                      "provincia varchar(30) not null, "
                      "tipo_tel_1 varchar(5), "
                      "telefono_1 varchar(20), "
                      "tipo_tel_2 varchar(5), "
                      "telefono_2 varchar(20), "
                      "email varchar(60), "
                      "constraint contratista_pkey primary key (apellido))")) {
        ShowCriticalError(query->lastError().text());
        return false;
    }

//    /**
//      * Se crea la tabla "cliente_eliminado" con la clausula "if not exists", es decir, si la
//      * tabla no existe, la misma será creada, en caso contrario, no lo hará.
//      */
//    if (! query->exec("create table if not exists cliente_eliminado "
//                      "(nro_cliente serial, "
//                      "razon_social varchar(60) not null, "
//                      "responsable varchar(60) not null, "
//                      "fecha_baja date not null, "
//                      "hora_baja time not null, "
//                      "constraint cliente_eliminado_pkey primary key (nro_cliente))")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "dominio" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists dominio "
//                      "(id_dominio serial, "
//                      "d_razon_social varchar(60) not null, "
//                      "val_dominio varchar(50) not null, "
//                      "es_primaria integer not null, " // 0 es primaria, 1 secundaria
//                      "fecha_alta_nic date not null, "
//                      "fecha_vencimiento_nic date not null, "
//                      "constraint pk_dominio primary key (id_dominio), "
//                      "constraint fk_dominio_cliente foreign key(d_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "autoadministrable" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists autoadministrable "
//                      "(id_autoadmin serial, "
//                      "a_razon_social varchar(60) not null, "
//                      "seccion varchar(50) not null, "
//                      "link varchar(150) not null, "
//                      "usuario varchar(50) not null, "
//                      "contrasenia varchar(50) not null, "
//                      "constraint pk_autoadmin primary key (id_autoadmin), "
//                      "constraint fk_autoadmin_cliente foreign key(a_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "movimiento" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists movimiento "
//                      "(id_mov serial not null, "
//                      "fecha_mov date not null, "
//                      "persona varchar(100), "
//                      "concepto varchar(300), "
//                      "tipo_moneda "
//                      "debe float not null, "
//                      "haber float not null, "
//                      "saldo float not null, "
//                      "constraint pk_movimiento primary key (id_mov, m_razon_social), "
//                      "constraint fk_movimiento_cliente foreign key(m_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "cuenta corriente" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists cuenta_corriente "
//                      "(id_cuenta_cor serial not null, "
//                      "cc_razon_social varchar(60) not null, "
//                      "tipo_cobro varchar(50) not null, "
//                      "concepto varchar(300), "
//                      "debe float not null, "
//                      "desde date not null, "
//                      "constraint pk_cc primary key (id_cuenta_cor, cc_razon_social), "
//                      "constraint fk_cc_cliente foreign key(cc_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "cobro mensual" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists cobro_mensual "
//                      "(id_cobro_mensual serial not null, "
//                      "cm_razon_social varchar(60) not null, "
//                      "mensualidad float not null, "
//                      "deuda varchar(100), "
//                      "web float not null, "
//                      "total float not null, "
//                      "constraint pk_cobro primary key (id_cobro_mensual, cm_razon_social), "
//                      "constraint fk_cobro_cliente foreign key(cm_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "pago mensual" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists pago_mensual "
//                      "(id_pago_mensual serial not null, "
//                      "pm_razon_social varchar(60) not null, "
//                      "anio integer not null, "
//                      "mes integer not null, "
//                      "monto float not null, "
//                      "constraint pk_pm primary key (id_pago_mensual, pm_razon_social), "
//                      "constraint fk_pagom_cliente foreign key(pm_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "deuda" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists deuda "
//                      "(id_deuda serial not null, "
//                      "d_razon_social varchar(60) not null, "
//                      "concepto varchar(300) not null, "
//                      "monto float not null, "
//                      "total float not null, "
//                      "constraint pk_deuda primary key (id_deuda, d_razon_social), "
//                      "constraint fk_deuda_cliente foreign key(d_razon_social) references cliente(razon_social) on delete cascade on update cascade)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se elimina el tipo TTipoGasto en caso de que exista.
//      */
//    if (! query->exec("drop type if exists t_tipo_gasto cascade")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea el tipo TEstadoCuenta, que corresponde con el estado de la cuenta
//      * del registro en nic.
//      */
//    if (! query->exec("create type t_tipo_gasto as enum ('Mensual','Esporadico')")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

//    /**
//      * Se crea la tabla "gasto por mes" con la clausula "if not exists", para evitar
//      * crear siempre la tabla.
//      */
//    if (! query->exec("create table if not exists gasto_mes "
//                      "(id_gasto_mes serial primary key, "
//                      "mes integer not null, "
//                      "anio integer not null, "
//                      "fecha date not null, "
//                      "concepto varchar(300) not null, "
//                      "tipo_gasto t_tipo_gasto not null, "
//                      "monto float not null, "
//                      "estado_pago varchar(30) not null, "
//                      "observaciones varchar(200) not null, "
//                      "quien_pago varchar(30) not null, "
//                      "suma_comun float not null, "
//                      "suma_pablo float not null, "
//                      "suma_lucas float not null, "
//                      "gasto_dividido float not null)")) {
//        ShowCriticalError(query->lastError().text());
//        return false;
//    }

////    /**
////    * Seccion para hacer modificaciones en la base de datos.
////    */
////    if (! query->exec("alter table cliente "
////                      "add column usuario_cpanel varchar(50) not null, "
////                      "add column contrasenia_cpanel varchar(30) not null, "
////                      "add column registrante_nic varchar(30) not null, "
////                      "add column email_registrante_nic varchar(50) not null, "
////                      "add column fecha_alta_nic date not null, "
////                      "add column fecha_vencimiento_nic date not null")) {
////        ShowCriticalError(query->lastError().text());
////        return false;
////    }

    return true;
}

/**
* Muestra el mensaje de error en caso de producirse uno de ellos. Toma como parametro
* un texto que es el detalle de la información del mensaje.
*/
void SchemaDB::ShowCriticalError(const QString &text)
{
    QMessageBox msg;
    msg.setStyleSheet("background-color: rgb(0, 139, 56);color: rgb(255, 255, 255);font: 12pt \"Helvetica57-Condensed\";border-style: solid");
    msg.setIcon(QMessageBox::Critical);
    msg.setText("Se ha producido un error. Por favor, intente nuevamente.");
    msg.setDetailedText(text);
    msg.addButton("Cerrar",QMessageBox::AcceptRole);
    msg.setWindowTitle("Alerta!");
    msg.exec();
}
